package com.xinzhitong.www.service;

import com.xinzhitong.www.exception.*;
import com.xinzhitong.www.exception.train.*;
import com.xinzhitong.www.exception.trainclassgeneral.NoTrainClassGeneralException;
import com.xinzhitong.www.pojo.TrainContact;
import com.xinzhitong.www.utils.MyPageInfo;

import java.util.List;
import java.util.Map;

/**
 * 培训服务
 *
 * @author 魏骆淳 钟伟良
 */
public interface TrainService {

    /**
     * 获取培训信息
     *
     * @param trainId 培训id
     * @return 培训信息
     * @throws NullTrainInformationException 培训信息空异常
     */
    Map<String, Object> getTrainInformation(Integer trainId) throws NullTrainInformationException;

     /**
     * 获取培训课次地点
     *
     * @param trainId      培训id
     * @param trainClassNo 培训课次号
     * @return 培训课次地点
     * @throws NullTrainClassLocationException 培训课次地点空异常
     */
//    Map<String, Object> getTrainClassLocation(
//            Integer trainId,
//            Integer trainClassNo) throws NullTrainClassLocationException;

    /**
     * 获取培训课次时间
     *
     * @param trainId      培训id
     * @param trainClassNo 培训课次号
     * @return 培训课次时间
     * @throws NullTrainClassTimeException 培训课次时间空异常
     */
//    Map<String, Object> getTrainClassTime(
//            Integer trainId,
//            Integer trainClassNo) throws NullTrainClassTimeException;

    /**
     * 获取培训课次地点
     *
     * @param trainId      培训id
     * @param trainClassNo 培训课次号
     * @return 培训课次地点
     * @throws NullTrainClassLocationException 培训课次地点空异常
     */
    List<Map<String, Object>> getTrainClassLocation(
            Integer trainId,
            Integer trainClassNo) throws NullTrainClassLocationException;

    /**
     * 获取培训课次时间
     *
     * @param trainId      培训id
     * @param trainClassNo 培训课次号
     * @return 培训课次时间
     * @throws NullTrainClassTimeException 培训课次时间空异常
     */
    List<Map<String, Object>> getTrainClassTime(
            Integer trainId,
            Integer trainClassNo) throws NullTrainClassTimeException;


    /**
     * 获取培训课次信息
     *
     * @param trainId      培训id
     * @param trainClassNo 培训课次号
     * @return 培训课次信息
     * @throws NullTrainClassInformationException 培训课次信息空异常
     */
    Map<String, Object> getTrainClassInformation(
            Integer trainId,
            Integer trainClassNo) throws NullTrainClassInformationException;

    /**
     * 获取培训概要
     *
     * @param professionalId 工种id
     * @param pageNo         页码
     * @param pageSize       页大小
     * @return 培训概要
     * @throws NullTrainOutlineException 培训概要空异常
     */
    MyPageInfo getTrainOutline(
            Integer professionalId,
            Integer pageNo,
            Integer pageSize
    ) throws NullTrainOutlineException;

    /**
     * 培训报名
     *
     * @param trainClassTimeId 培训课次id
     * @throws TrainException 培训异常
     */
    void getTrainClassApply(Integer trainClassTimeId) throws TrainException;

    /**
     * 获取培训课次
     *
     * @param trainId 培训id
     * @return 培训课次
     * @throws TrainException 培训异常
     */
    Map<String, Object> getTrainClass(Integer trainId) throws TrainException;

    /**
     * 获取培训课次报名信息
     *
     * @param trainClassTimeId 培训课次时间id
     * @return 培训课次报名信息
     * @throws TrainException 培训异常
     */
    Map<String, Object> getTrainClassApplyInformation(
            Integer trainClassTimeId
    ) throws TrainException;


    /**
     * 条件搜索课次概览
     *
     * @param time     课次时间
     * @param city     课次所在城市
     * @param pageNo   页码
     * @param pageSize 页大小
     * @return 课次信息
     * @throws TrainGeneralException 课次概览
     */
    List<Map<String, Object>> getTrainGeneral(String time, String city, Integer pageNo, Integer pageSize)
            throws TrainGeneralException;

    /**
     * 培训id查找联系方式
     *
     * @param trainId 培训id
     * @return 联系方式
     * @throws TrainContactException 联系方式异常
     */
    List<TrainContact> getContact(Integer trainId) throws TrainContactException;

    /**
     * 获取培训课表
     *
     * @param year  年
     * @param month 月
     * @return 课表
     * @throws TrainTableException 课表异常
     */
    List<Map<String, Object>> getUserTrain(Integer year, Integer month) throws TrainTableException;

    /**
     * 获取培训系统消息
     *
     * @param trainClassTimeId 培训课次时间id
     * @return 培训系统消息
     * @throws TrainException 培训异常
     */
    Map<String, Object> getTrainSystemMessage(Integer trainClassTimeId) throws TrainException;

    /**
     * 下架培训课次
     *
     * @param id 培训课次id
     * @return 空
     */
    String underTrainClass(Integer id);

    /**
     * 批量删除课次
     *
     * @param idList 课次id列表
     * @return 删除成功提示
     */
    String deleteTrainClass(List<Integer> idList);

    /**
     * 获取培训课次名字和No
     *
     * @param trainId 培训id
     * @return 培训课次信息
     * @throws TrainClassNameAndNoException 培训名字No异常
     */
    List<Map<String, Object>> selectTrainClassNameAndNo(Integer trainId) throws TrainClassNameAndNoException;

    /**
     * 获取培训名和id
     *
     * @param professionId 工种id
     * @return 培训信息
     * @throws TrainNameAndIdByProfessionIdException 异常
     */
    List<Map<String, Object>> selectTrainNameAndIdByProfessionId(Integer professionId) throws
            TrainNameAndIdByProfessionIdException;

    /**
     * 获取培训课次概览并支持关键字和状态查找
     *
     * @param state    状态
     * @param name     名字关键字
     * @param pageNo   页大小
     * @param pageSize 页码
     * @return 课次概览
     * @throws TrainClassGeneralException 课次概览异常
     */
    MyPageInfo getTrainClassGeneral(String state, String name, Integer pageNo, Integer pageSize)
            throws TrainClassGeneralException;

    /**
     * 获取培训课次报名情况
     *
     * @param trainClassId 培训课次id
     * @return 报名情况
     * @throws UserEnrollTrainClassConditionException 培训课次报名情况异常
     */
    List<Map<String, Object>> getTrainClassEnrollCondition(Integer trainClassId)
            throws UserEnrollTrainClassConditionException;

    /**
     * 下载培训课次报名情况表格
     *
     * @param trainClassId 培训课次id
     * @return 报名情况
     * @throws UserEnrollTrainClassConditionException 培训课次报名情况
     */
    String downloadTrainClassEnrollCondition(Integer trainClassId)
            throws UserEnrollTrainClassConditionException;


    /**
     * 获取培训基本信息
     *
     * @param trainClassTimeId 培训课次时间id
     * @return 培训基本信息
     * @throws TrainException 培训异常
     */
    Map<String, Object> getTrainBasicInformation(Integer trainClassTimeId) throws TrainException;

    /**
     * 获取培训重要指标
     *
     * @param trainClassTimeId 培训id
     * @return 培训重要指标
     * @throws TrainException 培训异常
     */
    Map<String, Object> getTrainIndex(Integer trainClassTimeId) throws TrainException;


    /**
     * 发布新增培训
     *
     * @param trainId           培训id
     * @param trainClassNo      培训课次号
     * @param startTime         开始时间
     * @param endTime           结束时间
     * @param requirePopulation 要求人数
     * @param fee               培训费用
     * @param contact           联系方式
     * @param startClock        开始时刻
     * @param endClock          结束时刻
     */
    void releaseTrain(
            Integer trainId,
            Integer trainClassNo,
            String startTime,
            String endTime,
            Integer requirePopulation,
            double fee,
            String contact,
            String startClock,
            String endClock
    );

    /**
     * 获取培训完整信息
     *
     * @param trainClassTimeId 培训课次id
     * @return 培训完整信息
     * @throws TrainException 培训异常
     */
    Map<String, Object> getTrainTotalInformation(Integer trainClassTimeId) throws TrainException;

    /**
     * 编辑培训
     *
     * @param trainClassTimeId  培训课次时间id
     * @param trainId           培训id
     * @param trainClassNo      培训课次号
     * @param startTime         开始时间
     * @param endTime           结束时间
     * @param requirePopulation 要求人数
     * @param fee               培训费用
     * @param contact           联系方式
     * @param startClock        开始时刻
     * @param endClock          结束时刻
     */
    void editTrain(
            Integer trainClassTimeId,
            Integer trainId,
            Integer trainClassNo,
            String startTime,
            String endTime,
            Integer requirePopulation,
            double fee,
            String contact,
            String startClock,
            String endClock
    );

    /**
     * 保存新增培训
     *
     * @param map 培训课次时间
     *            trainId           培训id
     *            trainClassNo      培训课次号
     *            startTime         开始时间
     *            endTime           结束时间
     *            requirePopulation 要求人数
     *            fee               培训费用
     *            contact           联系方式
     *            startClock        开始时刻
     *            endClock          结束时刻
     */
    void saveTrain(Map<String, Object> map);

    /**
     * 获取保存的培训信息
     *
     * @return 培训信息
     */
    Map<String, Object> getSavedTrain() throws TrainException;

    /**
     * 获取培训课次新增报名人数
     *
     * @return 新增人数
     */
    Integer getTrainClassNewEnroll();

    /**
     * 获取最近编辑培训课次时间
     *
     * @return 最近编辑培训课次时间
     * @throws TrainException 培训异常
     */
    Map<String, Object> getRecentEditorTrainClassTime() throws TrainException;

    /**
     * 获取培训基本信息(发布时间)
     *
     * @param trainClassTimeId 培训课次时间id
     * @return 培训基本信息
     * @throws TrainException 培训异常
     */
    Map<String, Object> getTrainBasicInformation2(Integer trainClassTimeId) throws TrainException;

    /**
     * 关键词及工种id搜索获取培训概览
     *
     * @param state        状态
     * @param keyWord      关键词
     * @param credentialId 工种id
     * @param pageNo       页码
     * @param pageSize     页大小
     * @return 培训概览
     * @throws NoTrainClassGeneralException 无更多培训概览异常
     */
    MyPageInfo getTrainClassGeneral(
            String keyWord,
            Integer credentialId,
            String state,
            Integer pageNo,
            Integer pageSize
    ) throws NoTrainClassGeneralException;

    /**
     * 获取指定培训概要
     *
     * @param trainClassTimeId 培训课次id
     * @return 培训概要信息
     */
    Map<String, Object> getTheTrainClassSummary(Integer trainClassTimeId);

    /**
     * 发布培训课次
     *
     * @param trainClassTimeId 培训课次id
     * @param text             意见文本
     */
    void publishTheTrainClassTime(Integer trainClassTimeId, String text);

    /**
     * 驳回培训课次
     *
     * @param trainClassTimeId 培训课次id
     * @param text             默认文本
     */
    void rejectTheTrainClassTime(Integer trainClassTimeId, String text);

}
